/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gradius.Elementos;

import gradius.Elementos.Naves.Vicviper;
import gradius.Elementos.Naves.Nave;
import gradius.Elementos.Naves.NaveFactory;
import gradius.Elementos.Tiros.Tiro;
import gradius.Elementos.Tiros.TiroFactory;
import gradius.Util.Timer;
import gradius.Util.TimerListener;
import gradius.Util.Util;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JPanel;

/**
 *
 * @author Eduardo
 */
public class TelaGrafica extends JPanel implements TimerListener, KeyListener
{
    private Timer timer;
    private Nave jogador;
    private ArrayList<Tiro> tirosAliados = new ArrayList<Tiro>();
    private ArrayList<Tiro> tirosInimigos = new ArrayList<Tiro>();
    private ArrayList<Nave> navesInimigas = new ArrayList<Nave>();

    public TelaGrafica()
    {
        this.setBackground(Color.BLACK);
        this.timer = new Timer(this, 50);
        this.jogador = NaveFactory.getInstance(this, Tipos.tipoNave.VICVIPER, 0, 100);
        this.tirosAliados.clear();
        this.tirosInimigos.clear();
        this.navesInimigas.clear();
        this.setFocusable(true);
        this.addKeyListener(this);
    }

    public void inicializar()
    {
        timer.start();
        navesInimigas.add(NaveFactory.getInstance(this, Tipos.tipoNave.CHEETOS1, this.getWidth()-1, 200));
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        for (int i=0; i<tirosAliados.size(); i++)
        {
            tirosAliados.get(i).desenha(g2);
        }

        for (int i=0; i<tirosInimigos.size(); i++)
        {
            tirosInimigos.get(i).desenha(g2);
        }

        for (int i=0; i<navesInimigas.size(); i++)
        {
            navesInimigas.get(i).desenha(g2);
        }
        jogador.desenha(g2);
    }

    public void update()
    {
        if (tirosAliados.size()>0)
        {
            for (int i=0; i<tirosAliados.size(); i++)
            {
                for (int j=0; j<navesInimigas.size(); j++)
                {
                    if (Util.colisao(tirosAliados.get(i), navesInimigas.get(j)))
                    {
                        navesInimigas.get(j).decrementaVidaNave(tirosAliados.get(i).getDanoTiro());
                        tirosAliados.remove(i);
                        if (navesInimigas.get(j).getVidaNave()<=0)
                        {
                            navesInimigas.add(NaveFactory.getInstance(this, Tipos.tipoNave.CHEETOS1, this.getWidth(), 200));
                            navesInimigas.remove(j);
                        }
                        break;
                    }
                }
            }
        }

        for (int i=0; i<tirosAliados.size(); i++)
        {
            tirosAliados.get(i).moveTiro();
        }

        for(int i=0; i<navesInimigas.size(); i++)
        {
            if (Util.foraDaTela(navesInimigas.get(i),this))
            {
                navesInimigas.remove(i);
                navesInimigas.add(NaveFactory.getInstance(this, Tipos.tipoNave.CHEETOS1, this.getWidth(), 200));
            }
            else
            {
                navesInimigas.get(i).movimenta();
            }
        }
        this.repaint();
    }

    public void keyTyped(KeyEvent e)
    {
    }

    public void keyPressed(KeyEvent e)
    {
        int c = e.getKeyCode();
        if (c == KeyEvent.VK_UP) // /\
        {
            if (jogador.getElementoCoordenada().getCoordY()>=20)
            {
                jogador.incrementaElementoCoordenada(0, -20);
            }
        }
        if (c == KeyEvent.VK_DOWN) // \/
        {
            if (jogador.getElementoCoordenada().getCoordY() + jogador.getElementoTamanho().getCoordY() < this.getSize().height)
            {
                jogador.incrementaElementoCoordenada(0, 20);
            }
        }
        if (c == KeyEvent.VK_LEFT) // <-
        {
            if (jogador.getElementoCoordenada().getCoordX()>=20)
            {
                jogador.incrementaElementoCoordenada(-20, 0);
            }
        }
        if (c == KeyEvent.VK_RIGHT) // ->
        {
            if (jogador.getElementoCoordenada().getCoordX() + jogador.getElementoTamanho().getCoordX() < this.getSize().width)
            {
                jogador.incrementaElementoCoordenada(20, 0);
            }
        }
        if (c == KeyEvent.VK_S)
        {
            jogador.atira(this,tirosAliados);
        }
    }
    
    public void keyReleased(KeyEvent e)
    {
    }
}
